#include <pc.h>
#include <stdio.h>
#include <stdlib.h>
#include "utypes.h"
#include "rtc.h"

Byte bcd2dec(Byte i)
{
	Byte dec = 0;
	dec += ((0x0F0 & i) >> 4) * 10;
	dec += 0x0F & i;
	return dec;

}

Byte dec2bcd(Byte i)
{
	Byte bcd = 0;
	bcd |= i % 10;
	bcd |= (i / 10) << 4;
	return bcd;
}

void rtc_valid()
{
	int ints_en = disable();
	outportb(RTC_ADDR_REG, RTC_STAT_A);
	while(inportb(RTC_STAT_A) & RTC_UIP == 0);
	if (ints_en)
		enable();

}

Byte read_rtc(Byte add)
{
	Byte ret;
	disable();
	outportb(RTC_ADDR_REG, add);
	ret = inportb(RTC_DATA_REG);
	enable();
	return ret;
}

Byte read_rtcv(Byte add)
{
	rtc_valid();
	return read_rtc(add);
}

void write_rtc(Byte add, Byte value)
{
	disable();
	outportb(RTC_ADDR_REG, add);
	outportb(RTC_DATA_REG, value);
	enable();
}

void write_rtcv(Byte add, Byte value)
{
	rtc_valid();
	write_rtc(add, value);
}

void rtc_read_time(RTC_TIME * time)
{
	time->sec = bcd2dec(read_rtcv(SEC));
	time->min = bcd2dec(read_rtcv(MIN));
	time->hour = bcd2dec(read_rtcv(HOUR));
}

void rtc_read_date(RTC_DATE * date)
{
	date->day = bcd2dec(read_rtcv(MONTH_DAY));
	date->month = bcd2dec(read_rtcv(MONTH));
	date->year = bcd2dec(read_rtcv(YEAR));
}

void rtc_read_alarm(RTC_TIME * time)
{
	time->sec = bcd2dec(read_rtcv(SEC_ALARM));
	time->min = bcd2dec(read_rtcv(MIN_ALARM));
	time->hour = bcd2dec(read_rtcv(HOUR_ALARM));
}

void rtc_write_alarm(RTC_TIME * time)
{
	write_rtcv(SEC_ALARM, dec2bcd(time->sec));
	write_rtcv(MIN_ALARM, dec2bcd(time->min));
	write_rtcv(HOUR_ALARM, dec2bcd(time->hour));
}
